package com.hive

import org.apache.spark.ml.recommendation.ALS
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.sum

/**
 * 学生-绩点关系矩阵
 */
object StuInfoMatrix {


  def main(args: Array[String]): Unit = {
    val spark =SparkSession
      .builder()
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()


    var df =spark.sql(
      """
        |select name,gpa,count(1) score from stuinfo.stu group by name,gpa order by gpa
        |""".stripMargin)
    println("cnt:"+df.count())

    // 学生-绩点关系矩阵
    df.groupBy("name").pivot("gpa").agg(sum("score")).show();

    // 学生-绩点 协同过滤算法。
    df =spark.sql(
      """
        |select hash(name) as id,gpa,count(1) score from stuinfo.stu group by name,gpa order by gpa
        |""".stripMargin)

    val als = new ALS()
      .setMaxIter(10)             // 迭代次数，用于最小二乘交替迭代的次数
      .setRank(3)                 // 隐向量的维度
      .setRegParam(0.01)          // 惩罚系数
      .setUserCol("id")         // user_id
      .setItemCol("gpa")        // item_id
      .setRatingCol("score")     // 评分列

    val model = als.fit(df)   // 训练模型

    // 打印用户向量和物品向量
    model.userFactors.show(truncate = false)
    model.itemFactors.show(truncate = false)

    // 给所有用户推荐2个物品
//        model.recommendForAllUsers(2).show()

    // 给每个物品推荐两个用户
//        model.recommendForAllItems(2).show()
  }



}
